#ifndef PLATEAURISQGRAPHICS_H
#define PLATEAURISQGRAPHICS_H

#include "graphwidget.h"
#include "plateaurisq.h"

class Client;
class PionGraphics;
class EtatGraphics;
class Joueur;

/**
 * @author LOPEZ CARON TAFFOREAU PERIGNON
 * @brief Réprésente le plateau RisQ de faÃ§on graphique
 *
 * Elle s'occupe de gérer les évènements client du réseau
 * ainsi que les actions de l'utilisateur sur le plateau
 *
 */
class PlateauRisQGraphics : public GraphWidget
{
    Q_OBJECT

public:
    PlateauRisQGraphics(QWidget *parent = 0);

    /**
     * @brief Charge le fichier image représentant le plateau
     * ainsi que le fichier xml représentant le plateau
     *
     * @param name Nom du plateau à charger
     * @return true en cas de succès false en cas d'erreur
     */
    bool loadBoard(QString name);

    /**
     * @brief Effectue une connexion à host
     * sur le port passé en param
     *
     * @param host Host/IP du serveur
     * @param port Port du serveur
     */
    void connexion(QString host, int port);

    /**
     * @brief Retourne le plateau du jeu
     *
     * @return PlateauRisQ *
     */
    PlateauRisQ *getPlateau(){ return plateau; }

    /**
     * @brief Définie le nom du joueur et instancie le joueur moi
     *
     * @param nom Nom du joueur voulu
     */
    void setJoueurNom(QString nom);




public slots:


    // Graphics slots
    /**
     * @brief Slot appelé lors de l'insertion d'un nouveau pion,
     * s'occupe d'ajouter le pion à la scène
     *
     * @param p
     */
    void nouveauPion(Pion *p);

    /**
     * @brief Slot appelé lors de la suppression d'un pion,
     * s'occupe de supprimer le pion de la scène
     *
     * @param p
     */
    void supprimerPion(Pion *p);

    /**
     * @brief Slot appelé lors de l'insertion d'un nouvel état
     * s'occupe d'ajouter l'état à la scène
     *
     * @param e
     */
    void nouveauEtat(Etat *e);

    /**
     * @brief Slot appelé lors de l'insertion d'une nouvelle frontière
     * s'occupe d'ajouter l'état à la scène
     *
     * @param e
     */
    void nouvelleFrontiere(Frontiere *e);

    void ChangeStatut();
    void AfficheMission();

    void ChangeJoueur(QString data);

    // Network slots
    void connecte();
    void deconnecte();
    void recvJoueurConnexion(Joueur *joueur);
    void recvJoueurDeconnexion(int id);
    void recvJoueursList(QList<Joueur*> joueurs);
    void recvJoueurId(int id);
    void recvMessage(QString src, QString msg, QString dest);
    void recvPaysList(QHash<int, int> etatsjoueurs);
    void recvPionAdd(int etatid);
    void recvPionRm(int etatid);
    void recvChangeStatut(int etape);
    void recvInitialise(QString valeurs);
    void recvSetJoueur(QString data);

    /**
     * @brief Envoie un message sur le chat
     * @todo Gestion du destinataire
     * @param dst
     * @param msg
     */
    void sendMessage(QString dst, QString msg);

    /**
     * @brief Envoie une demande d'assignation d'états au serveur
     *
     */
    void sendAssignerEtats();

    // Utils slots
    /**
     * @brief Cache/Affiche les fleches du graph
     * qui représentent les frontières
     *
     * @param b par default true
     */
    void hideFleche(bool b = true);


    /**
     * @brief Autorise les états à être déplacés sur le plateau
     *
     * @param b par default true
     */
    void moveEtat(bool b =  true);



signals:
    // Graphics signal
    /**
     * @brief Signal émit lors de la connexion/ajout d'un nouveau joueur
     *
     * @param
     */
    void nouveauJoueur(Joueur *);

    /**
     * @brief Signal émit lors de la déconnexion/suppression d'un nouveau joueur
     *
     * @param
     */
    void supprimerJoueur(Joueur *j);

    // Network signal
    /**
     * @brief Signal émit lors de l'arrivée d'un message pour le chat
     *
     * @param src
     * @param msg
     */
    void nouveauMessage(QString src, QString msg, QString dest, QString pseudo_joueur_actuel);

protected:
    Client *client; /**< Class réseau pour la communication avec les serveurs */
    PlateauRisQ *plateau; /**< Plateau du jeu */

    Pion *lastAddNet; /**< Stock le dernier pion ajouté par le réseau */
    Pion *lastRmNet; /**< Stock le dernier pion enlevé par le réseau */

    bool etatAssignerFlag; /**< Flag pour éviter de faire plusieurs assignations d'états*/
    bool hideFlecheFlag; /**< Flag pour cacher les flèches des frontières */
    bool moveEtatFlag; /**< Flag pour autoriser le déplacement des états */



};

#endif // PLATEAURISQGRAPHICS_H
